﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using TCC_Hotel.Serviços;
using TCC_Hotel.Entidades.Basicas;
using TCC_Hotel.Serviços.OtherServices;
using TCC_Hotel.Entidades;
using TCC_Hotel.Serviços.BDServices;

namespace TCC_Hotel.Apresentacao.Hospedes
{
    public partial class CadastrarHospede : System.Web.UI.Page
    {
        WebServices servicos = new WebServices();
        GeralServices geral = null;
        HospedeService servico = new HospedeService();
        
        /// <summary>
        /// Carregamento da página
        /// </summary>
        protected void Page_Load(object sender, EventArgs e)
        {
            //Recupera o usuario corrente
            string usuario = Request.ServerVariables["AUTH_USER"].ToString();
            LoginService servico_Login = new LoginService();
            //Verifica permissao ao acesso da página
            if (!servico_Login.RecuperarPermissaoCache(usuario).Cadastrar_Hospedes)
            {
                //Redireciona para a pagina inicial
                Response.Redirect("~/");
            }

            if (!IsPostBack)
            { 
                //recebe algumas informações cadastradas na reserva
                string nome = Request.Params["NomeHospede"];
                string RG = Request.Params["RGHospede"];
                string CPF = Request.Params["CPFHospede"];
                string Telefone = Request.Params["TelefoneHospede"];
                string CNPJ = Request.Params["Empresa"]; 

                txtNome.Text = nome;
                txtRG.Text = RG;
                txtCPF.Text = CPF;

                //Verifica se é não null para não gerar exceção
                if (!String.IsNullOrEmpty(Telefone))
                {
                    txtDDDTelefone1.Text = Telefone.Substring(0, 2);
                    txtTelefone1.Text = Telefone.Substring(2);
                }


                //Pega da url se ele estava na tela de faturados ou particulares
                bool faturado = Convert.ToBoolean(Request.Params["faturado"]);
                ckbFaturado.Checked = faturado;

                //Verifica o tipo do hóspede e habilita as caracteristicas extras
                if (ckbFaturado.Checked == true)
                {
                    plnFaturado.Visible = true;
                }
                else
                {
                    plnFaturado.Visible = false;
                }


                geral = new GeralServices();
                //popular o dropdown estados
                ddlEstado.DataSource = geral.GetEstados();
                ddlEstado.DataTextField = "nome";
                ddlEstado.DataValueField = "sigla";
                ddlEstado.DataBind();

                //São Paulo será o estado default
                ddlEstado.SelectedValue = "SP";

                //Chama o serviço de empresas
                EmpresaService servicoEmpresa = new EmpresaService();
                ddlEmpresas.DataSource = servicoEmpresa.RecuperarEmpresas().OrderBy(i=>i.Nome);
                ddlEmpresas.DataTextField = "Nome";
                ddlEmpresas.DataValueField = "CNPJ";                
                ddlEmpresas.DataBind();

                if (!String.IsNullOrEmpty(CNPJ))
                {
                    ddlEmpresas.SelectedValue = CNPJ;
                }

                
            }
        }

        /// <summary>
        /// Busca por CEP  o endereço correspondente
        /// </summary>
        protected void btnBuscaCEP_Click(object sender, EventArgs e)
        {
            //Chama o serviço que faz essa busca
            Endereco endereco = servicos.GetEnderecoPorCEP(txtCEP.Text);

            //Preenche os textbox com o endereço correspondente
            txtBairro.Text = endereco.Bairro;
            txtLogradouro.Text = endereco.Logradouro;
            txtCidade.Text = endereco.Cidade;

            if (!String.IsNullOrEmpty(endereco.Estado.sigla))
                ddlEstado.SelectedValue = endereco.Estado.sigla;

        }

        /// <summary>
        /// Evento de click do botão salvar
        /// </summary>
        protected void btnSalvar_Click(object sender, EventArgs e)
        {
           
            ComumServices comum = new ComumServices();

            //preenche a lista obrigatoria para verificar se todos os campos obrigatorios fora preenchidos
            List<string> listaObrigatoria = new List<string>() 
            { 
                txtNome.Text.Trim(),
                txtNascimento.Text,
                txtCPF.Text,
                txtRG.Text
            
            };

            //verifica se algum campo obrigatorio nao foi preenchido
            if (!comum.ValidaCamposObrigatorios(listaObrigatoria))
            {
                MensagemJS("ERRO: Campo(s) obrigatório(s) em branco");
                return;
            }
          

            //faz a validação da data de nascimento             
            if (!comum.ValidaData(txtNascimento.Text))
            {
                MensagemJS("ERRO: Data(s) inválida(s)");
                return;
            }

            //Faz validação do CPF
            if (!comum.ValidaCPF(txtCPF.Text))
            {
                MensagemJS("ERRO: CPF digitado não é válido");
                return;
            }

            //Faz validação do RG
            if (!comum.ValidaRG(txtRG.Text))
            {
                MensagemJS("ERRO: RG digitado não é válido");
                return;
            }

            //Faz validação dos telefones
            List<string> DDDs = new List<string>();
            List<string> Telefones = new List<string>();

            Telefones.Add(txtCelular1.Text);
            Telefones.Add(txtCelular2.Text);
            Telefones.Add(txtTelefone1.Text);
            Telefones.Add(txtTelefone2.Text);

            DDDs.Add(txtDDDCelular1.Text);
            DDDs.Add(txtDDDCelular2.Text);
            DDDs.Add(txtDDDTelefone1.Text);
            DDDs.Add(txtDDDTelefone2.Text);


            if (!comum.ValidaTelefones(DDDs, Telefones))
            {
                MensagemJS("ERRO: Telefones digitados não são válidos");
                return;
            }

            //se o hóspede a ser cadastrado for faturado
            if (ckbFaturado.Checked == true)
            {
                //Verifica se o RG ja esta cadastrado
                if (!servico.VerificarRGCadastradoFaturado(txtRG.Text))
                {
                    MensagemJS("ERRO: RG já cadastrado!");
                    return;
                }

            }
            else
            {
                //Verifica se o RG ja esta cadastrado
                if (!servico.VerificarRGCadastradoParticular(txtRG.Text))
                {
                    MensagemJS("ERRO: RG já cadastrado!");
                    return;
                }

            }

            InsereHospede();

        }

        /// <summary>
        /// Método privado que monta um objeto hóspede particular ou faturado e o envia para o serviço inclui-lo nos bancos
        /// </summary>
        private void InsereHospede()
        {
            int numero = 0;
            //Evitar excessao
            if (!String.IsNullOrEmpty(txtNumero.Text))
            {
                numero = Convert.ToInt32(txtNumero.Text);
            }


            //monta o objeto hóspede particular
            try
            {
                HospedeParticular hospede = new HospedeParticular()
                {
                    Nome = txtNome.Text.Trim(),
                    Nascimento = Convert.ToDateTime(txtNascimento.Text),
                    Contato = new Contato()
                    {

                        Celular = new List<string>() { (txtDDDCelular1.Text + txtCelular1.Text), (txtDDDCelular2.Text + txtCelular2.Text) },
                        Telefone = new List<string>() { (txtDDDTelefone1.Text + txtTelefone1.Text), (txtDDDTelefone2.Text + txtTelefone2.Text) },
                        Email = txtEmail.Text

                    },
                    Endereco = new Endereco()
                    {
                        Logradouro = txtLogradouro.Text.Trim(),
                        Bairro = txtBairro.Text.Trim(),
                        CEP = txtCEP.Text,
                        Cidade = txtCidade.Text.Trim(),
                        Complemento = txtComplemento.Text.Trim(),
                        Estado = new Estado() { nome = ddlEstado.SelectedItem.Text, sigla = ddlEstado.SelectedValue },
                        Numero = numero
                    },

                    CPF = txtCPF.Text,
                    RG = txtRG.Text,
                    

                };

                //se o hóspede a ser cadastrado for faturado
                if (ckbFaturado.Checked == true)
                {
                    HospedeFaturado hospedeFaturado = new HospedeFaturado()
                    {
                        CargoEmpresa = txtCargoEmpresa.Text,
                        Contato = hospede.Contato,
                        CPF = hospede.CPF,
                        Endereco = hospede.Endereco,
                        CNPJ = ddlEmpresas.SelectedValue,
                        Nascimento = hospede.Nascimento,
                        Nome = hospede.Nome,
                        RG = hospede.RG
                    };

                    //chama o serviço que insere o hóspede fatrurado nos bancos de dados
                    if (servico.CadastrarHospedeFaturado(hospedeFaturado))
                    {
                        MensagemJS("Hóspede incluído com sucesso!");
                        //limpa o chache existente para pegar os dados mais atualizados
                        HttpContext.Current.Cache.Remove("Lista_Hospedes_Faturados");
                    }
                    else
                    {
                        MensagemJS("ERRO: Hóspede com esse CPF já existente");
                        return;
                    }

                }
                //se o hóspede a ser cadastrado for particular
                else
                {

                    //chama o serviço que insere o hóspede particular nos bancos de dados
                    if (servico.CadastrarHospedeParticular(hospede))
                    {
                        MensagemJS("Hóspede incluído com sucesso!");
                       
                        //limpa o chache existente para pegar os dados mais atualizados
                        HttpContext.Current.Cache.Remove("Lista_Hospedes_Particulares");
                    }
                    else
                    {
                        MensagemJS("ERRO: Hóspede com esse CPF já foi adicionado");
                        return;
                    }
                }

            }
            catch (Exception)
            {
                //se ocorrer exceção lanca mensagem para o usuário
                MensagemJS("ERRO: Campo(s) com valor(es) inválido(s)");
                return;
            }

            //Limpa todos os campos após o cadastro
            btnLimpar_Click(null, null);
            
        }

        /// <summary>
        /// Método usado para limpar todos os campos
        /// </summary>
        protected void btnLimpar_Click(object sender, EventArgs e)
        {
            txtNome.Text = null;
            txtNascimento.Text = null;
            txtDDDCelular1.Text = null;
            txtDDDCelular2.Text = null;
            txtDDDTelefone1.Text = null;
            txtDDDTelefone2.Text = null;
            txtCelular1.Text = null;
            txtTelefone1.Text = null;
            txtCelular2.Text = null;
            txtEmail.Text = null;
            txtTelefone2.Text = null;
            txtLogradouro.Text = null;
            txtBairro.Text = null;
            txtComplemento.Text = null;
            txtCEP.Text = null;
            txtCidade.Text = null;
            txtNumero.Text = null;
            txtCPF.Text = null;
            txtRG.Text = null;
            txtCargoEmpresa.Text = null;

           
        }

        // <summary>
        /// Evento de click do botao voltar 
        /// </summary>
        protected void btnVoltar_Click(object sender, EventArgs e)
        {
            bool CheckIn = Convert.ToBoolean(Request.Params["CheckIn"]);

            //verifica se a tela anterior foi a de check-in
            if (CheckIn)
            {
                //recupera as variaveis passadas por parâmetros
                string apartamento = Request.Params["apartamento"];
                int ID_Reserva = Convert.ToInt32(Request.Params["id"]);
                int numeroHospedes = Convert.ToInt32(Request.Params["numeroHospedes"]);

                Response.Redirect("~/Apresentacao/CheckIn/TelaCheckIn.aspx?numeroHospedes=" + numeroHospedes + "&id=" + ID_Reserva + "&numeroApartamento=" + apartamento + "&cadastrou=true");
            }

            //Redireciona para a pagina anterior
            //Verifica o tipo do hóspede e habilita as caracteristicas extras
            if (ckbFaturado.Checked == true)
            {
                Response.Redirect("~/Apresentacao/Hospedes/ListarHospedesFaturados.aspx");
            }
            else
            {
                Response.Redirect("~/Apresentacao/Hospedes/ListarHospedesParticulares.aspx");
            }
            
        }

        /// <summary>
        /// Lança um popup em javaScript com alguma mensagem
        /// </summary>
        /// <param name="msg">Mensagem do popup</param>
        public void MensagemJS(string msg)
        {
            //Formata um alert para o usuário
            Page.ClientScript.RegisterStartupScript(

                     this.GetType(),

                     "error",

                     "$(window).load(function(){alert('" + msg + "')});",

                     true);

        }
    }
}